package com.michael.demos.base.java.arithmetic;

import java.util.LinkedHashMap;
import java.util.Map;

/**
 * 类功能描述:
 * <pre>
 *   使用 LinkedHashMap 实现 LRU 算法
 *
 *   PS：同样是非线程安全的
 * </pre>
 *
 * @author Michael
 * @version 1.0
 * @date 2021/01/22 10:53
 */
public class LruCacheLinkedHashMap<K, V> extends LinkedHashMap<K, V> {

    private int cacheSize;

    public LruCacheLinkedHashMap(int cacheSize) {
        // TODO 根据cacheSize 大小设置合适的初始化大小?
        super(16, 0.75f, true);
        this.cacheSize = cacheSize;
    }

    @Override
    protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
        return size() > cacheSize;
    }

    public static void main(String[] args) {

        LruCacheLinkedHashMap<String,String> cache = new LruCacheLinkedHashMap(5);
        cache.put("1", "我是用户1");
        cache.put("2", "我是用户2");
        cache.put("3", "我是用户3");
        cache.put("4", "我是用户4");
        cache.put("5", "我是用户5");
        cache.get("2");
        cache.put("3", "我是用户3的更新");
        cache.put("6", "我是用户6");
        cache.get("3");
        cache.get("5");
        cache.put("1", "我是用户1");

        System.out.println("获取缓存数据 KEY(6) -> " + cache.get("6"));
        System.out.println("获取缓存数据 KEY(1) -> " + cache.get("1"));
    }
}
